package br.unb.cic.algostep.leitor;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import br.unb.cic.algostep.Par;
import br.unb.cic.algostep.gui.arquivos.GerenciadorArquivos;
import br.unb.cic.algostep.gui.arquivos.VarFile;
import br.unb.cic.algostep.gui.arquivos.VarText;
import br.unb.cic.algostep.gui.console.Console;
import br.unb.cic.algostep.gui.editortexto.EditorTexto;
import br.unb.cic.algostep.gui.variaveis.Function;
import br.unb.cic.algostep.gui.variaveis.Mostrador;
import br.unb.cic.algostep.gui.variaveis.Parametro;
import br.unb.cic.algostep.gui.variaveis.Tipo;
import br.unb.cic.algostep.gui.variaveis.VarArray;
import br.unb.cic.algostep.gui.variaveis.VarBoolean;
import br.unb.cic.algostep.gui.variaveis.VarChar;
import br.unb.cic.algostep.gui.variaveis.VarInteger;
import br.unb.cic.algostep.gui.variaveis.VarMatriz;
import br.unb.cic.algostep.gui.variaveis.VarReal;
import br.unb.cic.algostep.gui.variaveis.VarRecord;
import br.unb.cic.algostep.gui.variaveis.VarString;
import br.unb.cic.algostep.gui.variaveis.Variavel;

public class Sintatica {
	int i;
	
	String function;
	public Sintatica(){		
	}

	/*
	 * Verifica se a sequência de tokens passada está ordenada conforme
	 * as regras da tabela de instruções.
	 */
	public void analisarSintaxe(ArrayList<TokenTabela> token, ArrayList<Estado> estado, Map<String,ArrayList<Variavel>> records, Mostrador mostrador, EditorTexto editor, Console console, GerenciadorArquivos ga) throws Exception{
		if (token.isEmpty()){
			return;
		}
		i = 0;
		//encontrou nro da linha
		if (token.get(i++).getIdToken() == TokenTabela.IDTKN_INTEIRO){

			if ((token.get(i).getIdToken() == TokenTabela.IDTKN_NOME) 
					||(token.get(i).getIdToken() == TokenTabela.IDTKN_RECORD)){

				// Caso de especificação de record *****
				//(Sintaxe: Ex:"01 record nome_reg; integer nome_var, outra_var; real var;" 
				if (token.get(i).getValorToken().equalsIgnoreCase("record")){
					if ((token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME) &&
							//token.get(++i).getIdToken() == TokenTabela.IDTKN_INTEIRO &&
							//token.get(++i).getIdToken() == TokenTabela.IDTKN_INTEIRO &&
							token.get(++i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA){
						ArrayList<Variavel>  variaveis = new ArrayList<Variavel>();

						while (++i < token.size()) {
							if (token.get(i).getValorToken().equalsIgnoreCase("integer")){
								if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
									if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
										if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
											variaveis.add(new VarMatriz(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													Integer.parseInt(token.get(++i).getValorToken()),
													VarInteger.class));
										}
										else {
											variaveis.add(new VarArray(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													VarInteger.class));
										}
									}
									else {
										variaveis.add(new VarInteger(token.get(i).getValorToken()));
									}
									while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
										//outras variaveis do mesmo tipo
										if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
											if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
												if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
													if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
														variaveis.add(new VarMatriz(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																Integer.parseInt(token.get(++i).getValorToken()),
																VarInteger.class));
													}
													else {
														variaveis.add(new VarArray(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																VarInteger.class));
													}
												}
												else {
													variaveis.add(new VarInteger(token.get(i).getValorToken()));
												}
											}
										}
									}
								}
							}
							else if (token.get(i).getValorToken().equalsIgnoreCase("real")){
								if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
									if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
										if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
											variaveis.add(new VarMatriz(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													Integer.parseInt(token.get(++i).getValorToken()),
													VarReal.class));
										}
										else {
											variaveis.add(new VarArray(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													VarReal.class));
										}
									}
									else {
										variaveis.add(new VarReal(token.get(i).getValorToken()));
									}
									while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
										//outras variaveis do mesmo tipo
										if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
											if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
												if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
													if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
														variaveis.add(new VarMatriz(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																Integer.parseInt(token.get(++i).getValorToken()),
																VarReal.class));
													}
													else {
														variaveis.add(new VarArray(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																VarReal.class));
													}
												}
												else {
													variaveis.add(new VarReal(token.get(i).getValorToken()));
												}
											}
										}
									}
								}
							}
							else if (token.get(i).getValorToken().equalsIgnoreCase("boolean")){
								if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
									if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
										if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
											variaveis.add(new VarMatriz(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													Integer.parseInt(token.get(++i).getValorToken()),
													VarBoolean.class));
										}
										else {
											variaveis.add(new VarArray(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													VarBoolean.class));
										}
									}
									else {
										variaveis.add(new VarBoolean(token.get(i).getValorToken()));
									}
									while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
										if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
											if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
												if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
													if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
														variaveis.add(new VarMatriz(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																Integer.parseInt(token.get(++i).getValorToken()),
																VarBoolean.class));
													}
													else {
														variaveis.add(new VarArray(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																VarBoolean.class));
													}
												}
												else {
													variaveis.add(new VarBoolean(token.get(i).getValorToken()));
												}
											}
										}
									}
								}
							}	
							else if (token.get(i).getValorToken().equalsIgnoreCase("char")){
								if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
									if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
										if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
											variaveis.add(new VarMatriz(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													Integer.parseInt(token.get(++i).getValorToken()),
													VarChar.class));
										}
										else {
											variaveis.add(new VarArray(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													VarChar.class));
										}
									}
									else {
										variaveis.add(new VarChar(token.get(i).getValorToken()));
									}
									while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
										if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
											if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
												if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
													if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
														variaveis.add(new VarMatriz(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																Integer.parseInt(token.get(++i).getValorToken()),
																VarChar.class));
													}
													else {
														variaveis.add(new VarArray(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																VarChar.class));
													}
												}
												else {
													variaveis.add(new VarChar(token.get(i).getValorToken()));
												}
											}
										}
									}
								}
							}
							else if (token.get(i).getValorToken().equalsIgnoreCase("string")){
								if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
									if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
										if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
											variaveis.add(new VarMatriz(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													Integer.parseInt(token.get(++i).getValorToken()),
													VarString.class));
										}
										else {
											variaveis.add(new VarArray(token.get(i).getValorToken(),
													Integer.parseInt(token.get(++i).getValorToken()), 
													VarString.class));
										}
									}
									else {
										variaveis.add(new VarString(token.get(i).getValorToken()));
									}
									while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
										if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
											if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
												if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
													if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
														variaveis.add(new VarMatriz(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																Integer.parseInt(token.get(++i).getValorToken()),
																VarString.class));
													}
													else {
														variaveis.add(new VarArray(token.get(i).getValorToken(),
																Integer.parseInt(token.get(++i).getValorToken()), 
																VarString.class));										}
												}
												else {
													variaveis.add(new VarString(token.get(i).getValorToken()));
												}
											}
										}
									}
								}
							} else {
								throw new Exception("Erro 105: Erro na sintaxe de declaração de variaveis do record.");
							}
						}
						//TODO EM ALGUM LUGAR AQUI TEM Q ESPECIFICAR A POSICAO DO RECORDS.
						records.put(token.get(2).getValorToken(), variaveis);
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return;
					} else {
						throw new Exception("Erro 104: Erro na sintaxe de declaração de record.");
					}
					// Fim dos casos de declaração de record ******
				} 
				
				//INICIO DA ANALISE PARA WRITELN NO CONSOLE
				else if (token.get(i).getValorToken().equalsIgnoreCase("writeln")){
					console.println(token.get(++i).getValorToken());

					int a = token.size();
					if ((token.get(++i).getValorToken().equalsIgnoreCase(";"))) {
						i++;
						if (i < a) {
							if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME ) {
								//casos de atribuicoes de variaveis após writeln*****
								do {
									if (token.get(++i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
										atribuicao(token.get(i-1), token.get(++i), -1, -1, estado, records, mostrador, editor, console, ga);
									} 
									else if(token.get(i).id_token == TokenTabela.IDTKN_ARRAY) {
										if (token.get(++i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
											atribuicao(token.get(i-2), token.get(++i), 
													Integer.parseInt(token.get(i-2).getValorToken()), -1, estado, records, mostrador, editor, console, ga);
										} 
										else if(token.get(i).id_token == TokenTabela.IDTKN_ARRAY) {
											if (token.get(++i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
												atribuicao(token.get(i-3), token.get(++i), 
														Integer.parseInt(token.get(i-3).getValorToken()), 
														Integer.parseInt(token.get(i-2).getValorToken()), estado, records, mostrador, editor, console, ga);
											} 
										}
									}
									else {
										throw new Exception("Erro 103: Esperava '=' ou '[]', mas "
												+token.get(i).getValorToken()+" foi encontrado");				
									}
									if (token.get(++i).id_token == TokenTabela.IDTKN_VIRGULA){
										if (token.get(++i).id_token != TokenTabela.IDTKN_NOME){
											throw new Exception("Erro 102: Esperava nome de variável após ','");
										}
									}
								}while (token.get(i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA);
							}
						}
					}
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;					
				}

				else if (token.get(i).getValorToken().equalsIgnoreCase("write")){
					console.print(token.get(++i).getValorToken());

					int a = token.size();
					if ((token.get(++i).getValorToken().equalsIgnoreCase(";"))) {
						i++;
						if (i < a) {
							if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME ) {						//casos de atribuicoes de variaveis após write*****
								//incialmente qualquer nome diferente dos anteriores
								//é tomado como uma variavel
								do {
									if (token.get(++i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
										atribuicao(token.get(i-1), token.get(++i), -1, -1, estado, records, mostrador, editor, console, ga);
									} 
									else if(token.get(i).id_token == TokenTabela.IDTKN_ARRAY) {
										if (token.get(++i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
											atribuicao(token.get(i-2), token.get(++i), 
													Integer.parseInt(token.get(i-2).getValorToken()), -1, estado, records, mostrador, editor, console, ga);
										} 
										else if(token.get(i).id_token == TokenTabela.IDTKN_ARRAY) {
											if (token.get(++i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
												atribuicao(token.get(i-3), token.get(++i), 
														Integer.parseInt(token.get(i-3).getValorToken()), 
														Integer.parseInt(token.get(i-2).getValorToken()), estado, records, mostrador, editor, console, ga);
											} 
										}
									}
									else {
										throw new Exception("Erro 103: Esperava '=' ou '[]', mas "
												+token.get(i).getValorToken()+" foi encontrado");				
									}
									if (token.get(++i).id_token == TokenTabela.IDTKN_VIRGULA){
										if (token.get(++i).id_token != TokenTabela.IDTKN_NOME){
											throw new Exception("Erro 102: Esperava nome de variável após ','");
										}
									}
								}while (token.get(i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA);
							}
						}
					}
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;						
				} 


				//---------------------------------------------------//
				//             COMANDOS PARA FILES                   //
				//---------------------------------------------------//


				//Formato do assign: assign(arquivo, nome);
				else if (token.get(i).getValorToken().equalsIgnoreCase("assign")) {
					ga.getArquivo(  token.get(++i).getValorToken()  ).assign(  token.get(++i).getValorToken()  );
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}

				//formato do Reset: reset(arquivo) 
				else if (token.get(i).getValorToken().equalsIgnoreCase("reset")) {
					ga.getArquivo(  token.get(++i).getValorToken()  ).reset();
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}

				//formato do Rewrite: rewrite(arquivo) 
				else if (token.get(i).getValorToken().equalsIgnoreCase("rewrite")) {
					ga.getArquivo(  token.get(++i).getValorToken()  ).rewrite();
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}

				//Formato do CLose: close(arquivo);
				else if (token.get(i).getValorToken().equalsIgnoreCase("close")) {
					ga.getArquivo(  token.get(++i).getValorToken()  ).close();
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}

				//TODO TESTAR!
				//Formato: bfwrite(arquivo, var); onde var é uma variavel a ser escrita no arquivo
				else if (token.get(i).getValorToken().equalsIgnoreCase("bfwrite")) {
					((VarFile) ga.getArquivo(token.get(++i).getValorToken())).write(mostrador.getCopiaVariavel(token.get(++i).getValorToken()));					
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}

				//Formato: fwrite arquivo var1 var2 var3 "string qualquer" var4 ...; onde var é uma variavel a ser escrita no arquivo ou uma string.
				else if (token.get(i).getValorToken().equalsIgnoreCase("fwrite")) {
					String arquivo = token.get(++i).getValorToken();
					TokenTabela temp = token.get(++i);
					while (!temp.getValorToken().equalsIgnoreCase(";")) {
						if (temp.getIdToken() == TokenTabela.IDTKN_STRING) {
							((VarText) ga.getArquivo(arquivo)).write(temp.getValorToken());
						} else {
							Variavel var = mostrador.getCopiaVariavel(temp.getValorToken());

							if (var instanceof VarChar) {						
								((VarText) ga.getArquivo(arquivo)).write((VarChar) var);
							} else if (var instanceof VarInteger) {
								((VarText) ga.getArquivo(arquivo)).write((VarInteger) var);
							} else if (var instanceof VarReal) {
								((VarText) ga.getArquivo(arquivo)).write((VarReal) var);
							} else if (var instanceof VarString) {
								((VarText) ga.getArquivo(arquivo)).write(((VarString) var).getValor());						
							} else if (var == null) {
								throw new Exception("Erro no fwrite! var == null");
							}							
						}	
						temp = token.get(++i);
					}
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}

				//Formato: fwriteln(arquivo, var); onde var é uma variavel a ser escrita no arquivo ou uma string.
				else if (token.get(i).getValorToken().equalsIgnoreCase("fwriteln")) {
					String arquivo = token.get(++i).getValorToken();
					TokenTabela temp = token.get(++i);
					while (!temp.getValorToken().equalsIgnoreCase(";")) {
						if (temp.getIdToken() == TokenTabela.IDTKN_STRING) {
							((VarText) ga.getArquivo(arquivo)).write(temp.getValorToken());
						} else {
							Variavel var = mostrador.getCopiaVariavel(temp.getValorToken());

							if (var instanceof VarChar) {						
								((VarText) ga.getArquivo(arquivo)).writeln((VarChar) var);
							} else if (var instanceof VarInteger) {
								((VarText) ga.getArquivo(arquivo)).writeln((VarInteger) var);
							} else if (var instanceof VarReal) {
								((VarText) ga.getArquivo(arquivo)).writeln((VarReal) var);
							} else if (var instanceof VarString) {
								((VarText) ga.getArquivo(arquivo)).writeln(((VarString) var).getValor());						
							} else if (var == null) {
								throw new Exception("Erro no fwrite! var == null");
							}							
						}	
						temp = token.get(++i);
					}
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}

				//Formato do FRead: fread arquivo tamanho variavel1 variavel2 ...;
				//TODO: Ta lendo 1 char por vez... Verficiar se eh isso mesmo
				else if (token.get(i).getValorToken().equalsIgnoreCase("fread")) {
					String arquivo = token.get(++i).getValorToken();
					int tamanho = Integer.parseInt(token.get(++i).getValorToken());
					String temp = token.get(++i).getValorToken();
					while (!temp.equalsIgnoreCase(";")) {
						mostrador.modificarVariavel(temp, ( (String) ((VarText) ga.getArquivo(arquivo)).readString(tamanho)));						
						temp = token.get(++i).getValorToken();						
					}
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);

					return;
				}

				//freadInt arquivo var1 var2 var3;
				else if(token.get(i).getValorToken().equalsIgnoreCase("freadint")) {
					String arquivo = token.get(++i).getValorToken();
					String temp = token.get(++i).getValorToken();
					
					if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
						if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
							Par<Integer,Integer> par;
							Map<Par<Integer,Integer>, Object> map;

							par = new Par<Integer,Integer>(Integer.parseInt(token.get(++i).getValorToken())-1,
									Integer.parseInt(token.get(++i).getValorToken())-1);
							map = new HashMap<Par<Integer,Integer>, Object>();
							Integer inte = (Integer) ((VarText)ga.getArquivo(arquivo)).readInt();
							map.put(par, inte);
							mostrador.modificarVariavel(temp, map);
						}
						else {
							Map<Integer, Object> map;

							map = new HashMap<Integer, Object>();
							Integer inte = (Integer) ((VarText)ga.getArquivo(arquivo)).readInt();
							map.put(Integer.parseInt(token.get(++i).getValorToken())-1, inte);
							mostrador.modificarVariavel(temp, map);	

						}
					}
					else{
						mostrador.modificarVariavel(temp, ((VarText)ga.getArquivo(arquivo)).readInt());	
					}
					
		/*			while (!temp.equalsIgnoreCase(";")) {
						mostrador.modificarVariavel(temp, ((VarText)ga.getArquivo(arquivo)).readInt());						
						temp = token.get(++i).getValorToken();						
					}
					*/
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}

				//freadReal arquivo var1 var2 var3;
				else if(token.get(i).getValorToken().equalsIgnoreCase("freadreal")) {
					String arquivo = token.get(++i).getValorToken();
					String temp = token.get(++i).getValorToken();;
					do {
					
						if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
							if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
								Par<Integer,Integer> par;
								Map<Par<Integer,Integer>, Object> map;
	
								par = new Par<Integer,Integer>(Integer.parseInt(token.get(++i).getValorToken())-1,
										Integer.parseInt(token.get(++i).getValorToken())-1);
								map = new HashMap<Par<Integer,Integer>, Object>();
								Double real = (Double) ((VarText)ga.getArquivo(arquivo)).readReal();
								map.put(par, real);
								mostrador.modificarVariavel(temp, map);
							}
							else {
								Map<Integer, Object> map;
	
								map = new HashMap<Integer, Object>();
								Double real = (Double) ((VarText)ga.getArquivo(arquivo)).readReal();
								map.put(Integer.parseInt(token.get(++i).getValorToken())-1, real);
								mostrador.modificarVariavel(temp, map);	
	
							}
						}
						else{
							mostrador.modificarVariavel(temp, ((VarText)ga.getArquivo(arquivo)).readReal());	
						}
						temp = token.get(++i).getValorToken();
					}while(!temp.equalsIgnoreCase(";"));
					
			/*		while (!temp.equalsIgnoreCase(";")) {
						mostrador.modificarVariavel(temp, ((VarText)ga.getArquivo(arquivo)).readReal());						
						temp = token.get(++i).getValorToken();						
					}
				*/	
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}

				//fReadln arquivo var1 var2 var3;
				else if(token.get(i).getValorToken().equalsIgnoreCase("freadln")) {
					String arquivo = token.get(++i).getValorToken();
					String temp = token.get(++i).getValorToken();
					while (!temp.equalsIgnoreCase(";")) {
						mostrador.modificarVariavel(temp, ((VarText)ga.getArquivo(arquivo)).readLine());						
						temp = token.get(++i).getValorToken();						
					}
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}
				
				//---------------------------------------------------//
				//                     FUNCTIONS                     //
				//---------------------------------------------------//

				//Formato do function: 
				//
				// 1 function <tipo> <nome da funcao>;<tipo> <arg1> = <valor>; <tipo> <arg2> = <valor>; ...
				//
				else if (token.get(i).getValorToken().equalsIgnoreCase("function")) {
					String temp = token.get(++i).getValorToken();
					//verifica se proxima palavra é um Tipo
//------------------ Function Integer
					if (temp.equalsIgnoreCase("integer")) {
						//Verifica se proxima palavra é o nome da funcao						
						if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME) {
							//Verifica se proxima palavra é ;
							if (token.get(++i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA) {
								function = token.get(i-1).getValorToken();
								ArrayList<Parametro> args = new ArrayList<Parametro>();
								Parametro arg = null;
								//Enquanto houver parâmentros a serem passados
								while(token.size()-1 > ++i){
									if(token.get(i).getValorToken().equalsIgnoreCase("integer")) {
										arg = new Parametro(Tipo.INTEGER, token.get(++i).getValorToken(), 
												Integer.parseInt(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("real")) {
										arg = new Parametro(Tipo.REAL, token.get(++i).getValorToken(), 
												Double.parseDouble(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("string")) {
										arg = new Parametro(Tipo.STRING, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("char")) {
										arg = new Parametro(Tipo.CHAR, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("boolean")) {
										arg = new Parametro(Tipo.BOOLEAN, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else throw new Exception ("Erro na declaração de Funcao! <tipo> <arg> <valor> esperado!");
									args.add(arg);
									
									if(token.get(++i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA) {
									}else throw new Exception ("Erro na declaração de Funcao! ';' esperado!");
								}
								Function funct = new Function(function, Tipo.INTEGER, args.toArray(new Parametro[]{}));
								mostrador.startFunction(funct);
								
								
							} else throw new Exception ("Erro na declaração de Funcao! ';' esperado!");
						} else throw new Exception ("Erro na declaração de Funcao! Nome da função esperado");
						
//------------------ Function Real						
					} else if (temp.equalsIgnoreCase("real")) {
						//Verifica se proxima palavra é o nome da funcao						
						if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME) {
							//Verifica se proxima palavra é ;
							if (token.get(++i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA) {
								function = token.get(--i).getValorToken();
								ArrayList<Parametro> args = new ArrayList<Parametro>();
								Parametro arg = null;
								//Enquanto houver parâmentros a serem passados
								while(token.size() >= ++i){
									if(token.get(i).getValorToken().equalsIgnoreCase("integer")) {
										arg = new Parametro(Tipo.INTEGER, token.get(++i).getValorToken(), 
												Integer.parseInt(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("real")) {
										arg = new Parametro(Tipo.REAL, token.get(++i).getValorToken(), 
												Double.parseDouble(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("string")) {
										arg = new Parametro(Tipo.STRING, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("char")) {
										arg = new Parametro(Tipo.CHAR, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("boolean")) {
										arg = new Parametro(Tipo.BOOLEAN, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else throw new Exception ("Erro na declaração de Funcao! <tipo> <arg> <valor> esperado!");
									args.add(arg);
								}
								Function funct = new Function(function, Tipo.REAL, args.toArray(new Parametro[]{}));
								mostrador.startFunction(funct);
								
							} else throw new Exception ("Erro na declaração de Funcao! ';' esperado!");
						} else throw new Exception ("Erro na declaração de Funcao! Nome da função esperado");
						
//------------------ Function Boolean						
					} else if (temp.equalsIgnoreCase("boolean")) {
						//Verifica se proxima palavra é o nome da funcao						
						if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME) {
							//Verifica se proxima palavra é ;
							if (token.get(++i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA) {
								function = token.get(--i).getValorToken();
								ArrayList<Parametro> args = new ArrayList<Parametro>();
								Parametro arg = null;
								//Enquanto houver parâmentros a serem passados
								while(token.size() >= ++i){
									if(token.get(i).getValorToken().equalsIgnoreCase("integer")) {
										arg = new Parametro(Tipo.INTEGER, token.get(++i).getValorToken(), 
												Integer.parseInt(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("real")) {
										arg = new Parametro(Tipo.REAL, token.get(++i).getValorToken(), 
												Double.parseDouble(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("string")) {
										arg = new Parametro(Tipo.STRING, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("char")) {
										arg = new Parametro(Tipo.CHAR, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("boolean")) {
										arg = new Parametro(Tipo.BOOLEAN, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else throw new Exception ("Erro na declaração de Funcao! <tipo> <arg> <valor> esperado!");
									args.add(arg);
								}
								Function funct = new Function(function, Tipo.BOOLEAN, args.toArray(new Parametro[]{}));
								mostrador.startFunction(funct);
								
							} else throw new Exception ("Erro na declaração de Funcao! ';' esperado!");
						} else throw new Exception ("Erro na declaração de Funcao! Nome da função esperado");
						
//------------------ Function Char
					} else if (temp.equalsIgnoreCase("char")) {
						//Verifica se proxima palavra é o nome da funcao						
						if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME) {
							//Verifica se proxima palavra é ;
							if (token.get(++i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA) {
								function = token.get(--i).getValorToken();
								ArrayList<Parametro> args = new ArrayList<Parametro>();
								Parametro arg = null;
								//Enquanto houver parâmentros a serem passados
								while(token.size() >= ++i){
									if(token.get(i).getValorToken().equalsIgnoreCase("integer")) {
										arg = new Parametro(Tipo.INTEGER, token.get(++i).getValorToken(), 
												Integer.parseInt(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("real")) {
										arg = new Parametro(Tipo.REAL, token.get(++i).getValorToken(), 
												Double.parseDouble(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("string")) {
										arg = new Parametro(Tipo.STRING, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("char")) {
										arg = new Parametro(Tipo.CHAR, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("boolean")) {
										arg = new Parametro(Tipo.BOOLEAN, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else throw new Exception ("Erro na declaração de Funcao! <tipo> <arg> <valor> esperado!");
									args.add(arg);
								}
								Function funct = new Function(function, Tipo.CHAR, args.toArray(new Parametro[]{}));
								mostrador.startFunction(funct);
								
							} else throw new Exception ("Erro na declaração de Funcao! ';' esperado!");
						} else throw new Exception ("Erro na declaração de Funcao! Nome da função esperado");
						
//------------------ Function string						
					} else if (temp.equalsIgnoreCase("string")) {
						//Verifica se proxima palavra é o nome da funcao						
						if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME) {
							//Verifica se proxima palavra é ;
							if (token.get(++i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA) {
								function = token.get(--i).getValorToken();
								ArrayList<Parametro> args = new ArrayList<Parametro>();
								Parametro arg = null;
								//Enquanto houver parâmentros a serem passados
								while(token.size() >= ++i){
									if(token.get(i).getValorToken().equalsIgnoreCase("integer")) {
										arg = new Parametro(Tipo.INTEGER, token.get(++i).getValorToken(), 
												Integer.parseInt(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("real")) {
										arg = new Parametro(Tipo.REAL, token.get(++i).getValorToken(), 
												Double.parseDouble(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("string")) {
										arg = new Parametro(Tipo.STRING, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("char")) {
										arg = new Parametro(Tipo.CHAR, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("boolean")) {
										arg = new Parametro(Tipo.BOOLEAN, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else throw new Exception ("Erro na declaração de Funcao! <tipo> <arg> <valor> esperado!");
									args.add(arg);
								}
								Function funct = new Function(function, Tipo.STRING, args.toArray(new Parametro[]{}));
								mostrador.startFunction(funct);
								
							} else throw new Exception ("Erro na declaração de Funcao! ';' esperado!");
						} else throw new Exception ("Erro na declaração de Funcao! Nome da função esperado");
						
//------------------ Procedure						
					} else if (temp.equalsIgnoreCase("void")) {
						//Verifica se proxima palavra é o nome da funcao						
						if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME) {
							//Verifica se proxima palavra é ;
							if (token.get(++i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA) {
								function = token.get(--i).getValorToken();
								ArrayList<Parametro> args = new ArrayList<Parametro>();
								Parametro arg = null;
								//Enquanto houver parâmentros a serem passados
								while(token.size() >= ++i){
									if(token.get(i).getValorToken().equalsIgnoreCase("integer")) {
										arg = new Parametro(Tipo.INTEGER, token.get(++i).getValorToken(), 
												Integer.parseInt(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("real")) {
										arg = new Parametro(Tipo.REAL, token.get(++i).getValorToken(), 
												Double.parseDouble(token.get(++i).getValorToken()));
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("string")) {
										arg = new Parametro(Tipo.STRING, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("char")) {
										arg = new Parametro(Tipo.CHAR, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else if(token.get(i).getValorToken().equalsIgnoreCase("boolean")) {
										arg = new Parametro(Tipo.BOOLEAN, token.get(++i).getValorToken(), 
												token.get(++i).getValorToken());
									}
									else throw new Exception ("Erro na declaração de Funcao! <tipo> <arg> <valor> esperado!");
									args.add(arg);
								}
								Function funct = new Function(function, Tipo.VOID, args.toArray(new Parametro[]{}));
								mostrador.startFunction(funct);
								
							} else throw new Exception ("Erro na declaração de Funcao! ';' esperado!");
						} else throw new Exception ("Erro na declaração de Funcao! Nome da função esperado");
					} else {
						throw new Exception ("Erro na declaração de Funcao! Tipo de retorno da função esperado, mas " + temp + " foi encontrado"); 
					}
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}
				
				else if (token.get(i).getValorToken().equalsIgnoreCase("end")) {
					if (token.get(++i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA) {
						mostrador.endFunction();
					} else {
						throw new Exception ("Erro no fim de Funcao! ';' esperado!");
					}
					
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return;
				}
				
				//casos de atribuicoes ou declarações.
				//qualquer nome diferente dos anteriores
				//é tomado como uma variavel
				else {
					if ( ! verificaDeclaracao(token, estado, records, mostrador, editor, console, ga) ) {
						do {
							if (token.get(++i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
								atribuicao(token.get(i-1), token.get(++i), -1, -1, estado, records, mostrador, editor, console, ga);
							} 
							else if(token.get(i).id_token == TokenTabela.IDTKN_ARRAY) {
								if (token.get(++i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
									atribuicao(token.get(i-2), token.get(++i), 
											Integer.parseInt(token.get(i-2).getValorToken()), -1, estado, records, mostrador, editor, console, ga);
								} 
								else if(token.get(i).id_token == TokenTabela.IDTKN_ARRAY) {
									if (token.get(++i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
										atribuicao(token.get(i-3), token.get(++i), 
												Integer.parseInt(token.get(i-3).getValorToken()), 
												Integer.parseInt(token.get(i-2).getValorToken()), estado, records, mostrador, editor, console, ga);
									} 
								}
							}
							else {
								throw new Exception("Erro 103: Esperava '=' ou '[]', mas "
										+token.get(i).getValorToken()+" foi encontrado");				
							}
							if (token.get(++i).id_token == TokenTabela.IDTKN_VIRGULA){
								if (token.get(++i).id_token != TokenTabela.IDTKN_NOME){
									throw new Exception("Erro 102: Esperava nome de variável após ','");
								}
							}
						}while (token.get(i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA);
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return;
					}					
				}
			} 
			else if (token.get(i).getIdToken() == TokenTabela.IDTKN_PONTO_VIRGULA){
				salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
				return;
			} else {
				throw new Exception("Erro 101: \";\" esperado.\nToken errado: " + token.get(0).getValorToken());
			}
		} else {
			throw new Exception("Erro 100: Número de linha esperado.\nToken errado: " + token.get(0).getValorToken());
		}
		//throw new Exception("Erro REALMENTE desconhecido!");
	}

	private void salvarEstadoAtual(String linha, ArrayList<Estado> estado, Map<String,ArrayList<Variavel>> records, Mostrador mostrador, EditorTexto editor, Console console, GerenciadorArquivos ga){
		Estado estadoAtual = new Estado();
		estadoAtual.Estadoga = ga.getEstado();
		estadoAtual.EstadoMostrador = mostrador.getEstado();
		estadoAtual.EstadoConsole = console.getEstado();
		editor.getCaixaTexto().setMarcada(Integer.parseInt(linha));
		estadoAtual.EstadoTexto = editor.getEstado();
		estado.add(estadoAtual);
	}
	
	private boolean verificaDeclaracao(ArrayList<TokenTabela> token, ArrayList<Estado> estado, Map<String,ArrayList<Variavel>> records, Mostrador mostrador, EditorTexto editor, Console console, GerenciadorArquivos ga) throws Exception{
		//		tipo inteiro
		if (token.get(i).getValorToken().equalsIgnoreCase("integer")){
			if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
				//Adiciona na lista de variaveis e verifica se é um array ou matriz;
				if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
					if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
						mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								Integer.parseInt(token.get(++i).getValorToken()),
								VarInteger.class));
					}
					else {
						mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								VarInteger.class));
					}
				}
				else {
					mostrador.adicionarVariavel(new VarInteger(token.get(i).getValorToken()));
				}
				//Verifica outras operações na mesma linha
				while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
					//criacao de outra variavel
					if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
						if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
							if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
								if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
									mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											Integer.parseInt(token.get(++i).getValorToken()),
											VarInteger.class));
								}
								else {
									mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											VarInteger.class));
								}
							}
							else {
								mostrador.adicionarVariavel(new VarInteger(token.get(i).getValorToken()));
							}
						}
					}
					//inicializacao da variavel
					else if (token.get(i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
						if(token.get(i+2).id_token == TokenTabela.IDTKN_ARRAY) {
							if(token.get(i+3).id_token == TokenTabela.IDTKN_ARRAY) {
								atribuicao(token.get(i-1), token.get(++i),
										Integer.parseInt(token.get(++i).getValorToken()),
										Integer.parseInt(token.get(++i).getValorToken()),  estado, records, mostrador, editor, console, ga);
							}
							else {
								atribuicao(token.get(i-1), token.get(++i), 
										Integer.parseInt(token.get(++i).getValorToken()), -1,  estado, records, mostrador, editor, console, ga);
							}
						}
						else
							atribuicao(token.get(i-1), token.get(++i), -1, -1,  estado, records, mostrador, editor, console, ga);
					}
					else if (token.get(i).id_token == TokenTabela.IDTKN_PONTO_VIRGULA){
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
					else{
						throw new Exception("Erro 106: Erro na declaracao de inteiro.");
					}
				}
				salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
				return true;
			}
		}
		//tipo real	
		else if (token.get(i).getValorToken().equalsIgnoreCase("real")){
			if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
				if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
					if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
						mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								Integer.parseInt(token.get(++i).getValorToken()),
								VarReal.class));
					}
					else {
						mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								VarReal.class));
					}
				}
				else {
					mostrador.adicionarVariavel(new VarReal(token.get(i).getValorToken()));
				}
				while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
					if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
						if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
							if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
								if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
									mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											Integer.parseInt(token.get(++i).getValorToken()),
											VarReal.class));
								}
								else {
									mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											VarReal.class));
								}
							}
							else {
								mostrador.adicionarVariavel(new VarReal(token.get(i).getValorToken()));
							}
						}
					}
					else if (token.get(i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
						if(token.get(i+2).id_token == TokenTabela.IDTKN_ARRAY) {
							if(token.get(i+3).id_token == TokenTabela.IDTKN_ARRAY) {
								atribuicao(token.get(i-1), token.get(++i),
										Integer.parseInt(token.get(++i).getValorToken()),
										Integer.parseInt(token.get(++i).getValorToken()), estado, records, mostrador, editor, console, ga);
							}
							else {
								atribuicao(token.get(i-1), token.get(++i), 
										Integer.parseInt(token.get(++i).getValorToken()), -1, estado, records, mostrador, editor, console, ga);
							}
						}
						else
							atribuicao(token.get(i-1), token.get(++i), -1, -1, estado, records, mostrador, editor, console, ga);
					}
					else if (token.get(i).id_token == TokenTabela.IDTKN_PONTO_VIRGULA){
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
					else{
						throw new Exception("Erro 107: Erro na declaracao de real.");
					}
				}
				salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
				return true;
			}
		}
		//tipo boolean	
		else if (token.get(i).getValorToken().equalsIgnoreCase("boolean")){
			if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
				if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
					if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
						mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								Integer.parseInt(token.get(++i).getValorToken()),
								VarBoolean.class));
					}
					else {
						mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								VarBoolean.class));
					}
				}
				else {
					mostrador.adicionarVariavel(new VarBoolean(token.get(i).getValorToken()));
				}
				while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
					if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
						if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
							if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
								if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
									mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											Integer.parseInt(token.get(++i).getValorToken()),
											VarBoolean.class));
								}
								else {
									mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											VarBoolean.class));
								}
							}
							else {
								mostrador.adicionarVariavel(new VarBoolean(token.get(i).getValorToken()));
							}
						}
					}
					else if (token.get(i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
						if(token.get(i+2).id_token == TokenTabela.IDTKN_ARRAY) {
							if(token.get(i+3).id_token == TokenTabela.IDTKN_ARRAY) {
								atribuicao(token.get(i-1), token.get(++i),
										Integer.parseInt(token.get(++i).getValorToken()),
										Integer.parseInt(token.get(++i).getValorToken()), estado, records, mostrador, editor, console, ga);
							}
							else {
								atribuicao(token.get(i-1), token.get(++i), 
										Integer.parseInt(token.get(++i).getValorToken()), -1, estado, records, mostrador, editor, console, ga);
							}
						}
						else
							atribuicao(token.get(i-1), token.get(++i), -1, -1, estado, records, mostrador, editor, console, ga);
					}
					else if (token.get(i).id_token == TokenTabela.IDTKN_PONTO_VIRGULA){
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
					else{
						throw new Exception("Erro 108: Erro na declaracao de boolean.");
					}
				}
				salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
				return true;
			}
		}
		//tipo char	
		else if (token.get(i).getValorToken().equalsIgnoreCase("char")){
			if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
				if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
					if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
						mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								Integer.parseInt(token.get(++i).getValorToken()),
								VarChar.class));
					}
					else {
						mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								VarChar.class));
					}
				}
				else {
					mostrador.adicionarVariavel(new VarChar(token.get(i).getValorToken()));
				}
				while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
					if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
						if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
							if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
								if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
									mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											Integer.parseInt(token.get(++i).getValorToken()),
											VarChar.class));
								}
								else {
									mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											VarChar.class));
								}
							}
							else {
								mostrador.adicionarVariavel(new VarChar(token.get(i).getValorToken()));
							}
						}
					}
					else if (token.get(i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
						if(token.get(i+2).id_token == TokenTabela.IDTKN_ARRAY) {
							if(token.get(i+3).id_token == TokenTabela.IDTKN_ARRAY) {
								atribuicao(token.get(i-1), token.get(++i),
										Integer.parseInt(token.get(++i).getValorToken()),
										Integer.parseInt(token.get(++i).getValorToken()), estado, records, mostrador, editor, console, ga);
							}
							else {
								atribuicao(token.get(i-1), token.get(++i), 
										Integer.parseInt(token.get(++i).getValorToken()), -1, estado, records, mostrador, editor, console, ga);
							}
						}
						else
							atribuicao(token.get(i-1), token.get(++i), -1, -1, estado, records, mostrador, editor, console, ga);
					}
					else if (token.get(i).id_token == TokenTabela.IDTKN_PONTO_VIRGULA){
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
					else{
						throw new Exception("Erro 109: Erro na declaracao de char.");
					}
				}
				salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
				return true;
			}
		}
		//tipo string	
		else if (token.get(i).getValorToken().equalsIgnoreCase("string")){
			if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
				if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
					if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
						mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								Integer.parseInt(token.get(++i).getValorToken()),
								VarString.class));
					}
					else {
						mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								VarString.class));
					}
				}
				else {
					mostrador.adicionarVariavel(new VarString(token.get(i).getValorToken()));
				}
				while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
					if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
						if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
							if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
								if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
									mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											Integer.parseInt(token.get(++i).getValorToken()),
											VarString.class));
								}
								else {
									mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											VarString.class));										}
							}
							else {
								mostrador.adicionarVariavel(new VarString(token.get(i).getValorToken()));
							}
						}
					}
					else if (token.get(i).id_token == TokenTabela.IDTKN_ATRIBUICAO) {
						if(token.get(i+2).id_token == TokenTabela.IDTKN_ARRAY) {
							if(token.get(i+3).id_token == TokenTabela.IDTKN_ARRAY) {
								atribuicao(token.get(i-1), token.get(++i),
										Integer.parseInt(token.get(++i).getValorToken()),
										Integer.parseInt(token.get(++i).getValorToken()), estado, records, mostrador, editor, console, ga);
							}
							else {
								atribuicao(token.get(i-1), token.get(++i), 
										Integer.parseInt(token.get(++i).getValorToken()), -1, estado, records, mostrador, editor, console, ga);
							}
						}
						else 
							atribuicao(token.get(i-1), token.get(i+1), -1, -1, estado, records, mostrador, editor, console, ga);
					}
					else if (token.get(i).id_token == TokenTabela.IDTKN_PONTO_VIRGULA){
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
					else{
						throw new Exception("Erro 110: Erro na declaracao de string.");
					}
				}
				salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
				return true;
			}
		}

		//Tipo file
		else if (token.get(i).getValorToken().equalsIgnoreCase("file")){
			if (token.get(++i).getValorToken().equalsIgnoreCase("integer")){
				if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
					if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
						if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
							new VarMatriz("x",Integer.parseInt(token.get(++i).getValorToken()),
									Integer.parseInt(token.get(++i).getValorToken()), 
									VarInteger.class);
							return true;
						}
						else {
							ga.adicionarArquivo(new VarFile(token.get(i).getValorToken(),
									new VarArray("x",Integer.parseInt(token.get(++i).getValorToken()), 
											VarInteger.class)));
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
					}
					else {
						ga.adicionarArquivo
						(new VarFile(token.get(i).getValorToken(),new VarInteger("x")));
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
				}
				else {
					throw new Exception("Erro 111: Erro na declaracao de tipo de file.");
				}
			}
			else if (token.get(i).getValorToken().equalsIgnoreCase("real")){
				if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
					if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
						if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
							new VarMatriz("x",Integer.parseInt(token.get(++i).getValorToken()),
									Integer.parseInt(token.get(++i).getValorToken()), 
									VarReal.class);
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
						else {
							ga.adicionarArquivo(new VarFile(token.get(i).getValorToken(),
									new VarArray("x",Integer.parseInt(token.get(++i).getValorToken()), 
											VarReal.class)));
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
					}
					else {
						ga.adicionarArquivo
						(new VarFile(token.get(i).getValorToken(),new VarReal("x")));
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
				}
				else {
					throw new Exception("Erro 111: Erro na declaracao de tipo de file.");
				}
			}

			else if (token.get(i).getValorToken().equalsIgnoreCase("boolean")){
				if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
					if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
						if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
							new VarMatriz("x",Integer.parseInt(token.get(++i).getValorToken()),
									Integer.parseInt(token.get(++i).getValorToken()), 
									VarBoolean.class);
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
						else {
							ga.adicionarArquivo(new VarFile(token.get(i).getValorToken(),
									new VarArray("x",Integer.parseInt(token.get(++i).getValorToken()), 
											VarBoolean.class)));
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
					}
					else {
						ga.adicionarArquivo
						(new VarFile(token.get(i).getValorToken(),new VarBoolean("x")));
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
				}
				else {
					throw new Exception("Erro 111: Erro na declaracao de tipo de file.");
				}
			}
			else if (token.get(i).getValorToken().equalsIgnoreCase("char")){
				if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
					if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
						if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
							new VarMatriz("x",Integer.parseInt(token.get(++i).getValorToken()),
									Integer.parseInt(token.get(++i).getValorToken()), 
									VarChar.class);
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
						else {
							ga.adicionarArquivo(new VarFile(token.get(i).getValorToken(),
									new VarArray("x",Integer.parseInt(token.get(++i).getValorToken()), 
											VarChar.class)));
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
					}
					else {
						ga.adicionarArquivo
						(new VarFile(token.get(i).getValorToken(),new VarChar("x")));
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
				}
				else {
					throw new Exception("Erro 111: Erro na declaracao de tipo de file.");
				}
			}
			else if (token.get(i).getValorToken().equalsIgnoreCase("string")){
				if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
					if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
						if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
							new VarMatriz("x",Integer.parseInt(token.get(++i).getValorToken()),
									Integer.parseInt(token.get(++i).getValorToken()), 
									VarString.class);
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
						else {
							ga.adicionarArquivo(new VarFile(token.get(i).getValorToken(),
									new VarArray("x",Integer.parseInt(token.get(++i).getValorToken()), 
											VarString.class)));	
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
					}
					else {
						ga.adicionarArquivo
						(new VarFile(token.get(i).getValorToken(),new VarString("x")));
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
				}
				else {
					throw new Exception("Erro 111: Erro na declaracao de tipo de file.");
				}
			}
			
			else if(token.get(i).getValorToken().equalsIgnoreCase("text")) {
				if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
					while (i < token.size()){
						ga.adicionarArquivo(new VarText(token.get(i).getValorToken()));
						i+=2;
					}
					salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
					return true;
				} else {
					throw new Exception("Erro 111a: Nome da variavel esperado apos o FILE TEXT.");
				}
				
			}
			else if(records.containsKey(token.get(i).getValorToken())) {
				if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
					if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
						if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
							new VarMatriz("x",Integer.parseInt(token.get(++i).getValorToken()),
									Integer.parseInt(token.get(++i).getValorToken()), 
									VarRecord.class);
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
						else {
							ga.adicionarArquivo(new VarFile(token.get(i).getValorToken(),
									new VarArray(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											new VarRecord("",records.get(token.get(2).getValorToken())))));		
							salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
							return true;
						}
					}
					else {
						ga.adicionarArquivo
						(new VarFile (token.get(i).getValorToken(),new VarRecord("x",
								records.get(token.get(2).getValorToken()))));
						salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
						return true;
					}
				}
			}
		}


		// Tipo record
		else if(records.containsKey(token.get(i).getValorToken())) {
			if (token.get(++i).getIdToken() == TokenTabela.IDTKN_NOME){
				if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
					if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
						mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								Integer.parseInt(token.get(++i).getValorToken()),
								new VarRecord("",records.get(token.get(1).getValorToken()))));
					}
					else {
						mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
								Integer.parseInt(token.get(++i).getValorToken()), 
								new VarRecord("",records.get(token.get(1).getValorToken()))));

					}
				}
				else {
					mostrador.adicionarVariavel(new VarRecord(token.get(i).getValorToken(),
							records.get(token.get(1).getValorToken())));
				}
				while(token.get(++i).id_token != TokenTabela.IDTKN_PONTO_VIRGULA) {
					if (token.get(i).id_token == TokenTabela.IDTKN_VIRGULA) {
						if (token.get(++i).id_token == TokenTabela.IDTKN_NOME) {
							if(token.get(i+1).getIdToken() == TokenTabela.IDTKN_ARRAY){
								if (token.get(i+2).getIdToken() == TokenTabela.IDTKN_ARRAY){
									mostrador.adicionarVariavel(new VarMatriz(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											Integer.parseInt(token.get(++i).getValorToken()),
											VarRecord.class));
								}
								else {
									mostrador.adicionarVariavel(new VarArray(token.get(i).getValorToken(),
											Integer.parseInt(token.get(++i).getValorToken()), 
											new VarRecord("",records.get(token.get(1).getValorToken()))));										}
							}
							else {
								mostrador.adicionarVariavel(new VarRecord(token.get(i).getValorToken(),
										records.get(token.get(1).getValorToken())));
							}
						}
						else {
							throw new Exception("Erro 112: Nome de uma das variaveis de tipo \"record\" não encontrada.");									
						}
					}
					else {
						throw new Exception("Erro 113: Esperava \",\" ou \";\" na declaração de record");
					}
				}
				salvarEstadoAtual(token.get(0).getValorToken(), estado, records, mostrador, editor, console, ga);
				return true;
			}
			else{
				throw new Exception("Erro 114: Nome da variavel de tipo \"record\" não encontrado");
			}
		}
		return false;
	}
	
	private void atribuicao(TokenTabela variavel, TokenTabela valor, int linha, int coluna, ArrayList<Estado> estado, Map<String,ArrayList<Variavel>> records, Mostrador mostrador, EditorTexto editor, Console console, GerenciadorArquivos ga){ 
		if(variavel.getIdToken() == TokenTabela.IDTKN_NOME) {
			switch (valor.getIdToken()){

			case TokenTabela.IDTKN_INTEIRO:
				if (linha != -1) {
					if (coluna != -1) {
						Par<Integer,Integer> par;
						Map<Par<Integer,Integer>, Object> map;

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map = new HashMap<Par<Integer,Integer>, Object>();
						map.put(par, Integer.parseInt(valor.getValorToken()));
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
					else {
						Map<Integer, Object> map;

						map = new HashMap<Integer, Object>();
						map.put(linha-1, Integer.parseInt(valor.getValorToken()));
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
				}
				else {
					mostrador.modificarVariavel(variavel.valor_token, Integer.parseInt(valor.getValorToken()));
				}
				break;
			case TokenTabela.IDTKN_REAL:
				if (linha != -1) {
					if (coluna != -1) {
						Par<Integer,Integer> par;
						Map<Par<Integer,Integer>, Object> map;

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map   = new HashMap<Par<Integer,Integer>, Object>();
						map.put(par, Double.parseDouble(valor.getValorToken()));
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
					else {
						Map<Integer, Object> map;

						map = new HashMap<Integer, Object>();
						map.put(linha-1, Double.parseDouble(valor.getValorToken()));
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
				}
				else {
					mostrador.modificarVariavel(variavel.valor_token, Double.parseDouble(valor.getValorToken()));
				}
				break;
			case TokenTabela.IDTKN_CHAR:
				Object val_char = new Character(valor
						.getValorToken().charAt(0));
				if (linha != -1) {
					if (coluna != -1) {
						Par<Integer,Integer> par;
						Map<Par<Integer,Integer>, Object> map;

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map   = new HashMap<Par<Integer,Integer>, Object>();
						map.put(par, val_char);
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
					else {
						Map<Integer, Object> map;

						map = new HashMap<Integer, Object>();
						map.put(linha-1, val_char);
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
				}
				else {
					mostrador.modificarVariavel(variavel.valor_token, new Character(valor.getValorToken().charAt(0)));
				}
				break;
			case TokenTabela.IDTKN_STRING:
				if (linha != -1) {
					if (coluna != -1) {
						Par<Integer,Integer> par;
						Map<Par<Integer,Integer>, Object> map;

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map = new HashMap<Par<Integer,Integer>, Object>();
						map.put(par, valor.getValorToken());
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
					else {
						Map<Integer, Object> map;

						map = new HashMap<Integer, Object>();
						map.put(linha-1, valor.getValorToken());
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
				}
				else {
					mostrador.modificarVariavel(variavel.valor_token, valor.getValorToken());
				}
				break;
			case	 TokenTabela.IDTKN_BOOLEAN:
				boolean val = true;
				if (valor.getValorToken().equalsIgnoreCase("false")){
					val = false;
				}
				if (linha != -1) {
					if (coluna != -1) {
						Par<Integer,Integer> par;
						Map<Par<Integer,Integer>, Object> map;

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map = new HashMap<Par<Integer,Integer>, Object>();
						map.put(par, val);
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
					else {
						Map<Integer, Object> map;

						map = new HashMap<Integer, Object>();
						map.put(linha-1, val);
						mostrador.modificarVariavel(variavel.valor_token, map);
					}
				}
				else {
					mostrador.modificarVariavel(variavel.valor_token, val);
				}
				break;
			}
		}
		else if (variavel.getIdToken() == TokenTabela.IDTKN_RECORD) {

			switch (valor.getIdToken()){
			case TokenTabela.IDTKN_INTEIRO:
				if (linha != -1) {
					if (coluna != -1) { 

						Par<Integer,Integer> par;
						Map<Par<Integer,Integer>, Object> map2;

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map2 = new HashMap<Par<Integer,Integer>, Object>();
						map2.put(par, Integer.parseInt(valor.getValorToken()));

						Map<String, Object> map; 

						map = new HashMap<String, Object>();
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar (), map);
					}
					else {
						Map<Integer, Object> map2;

						map2 = new HashMap<Integer, Object>();
						map2.put (linha-1, Integer.parseInt(valor.getValorToken()));

						Map<String, Object> map;

						map = new HashMap<String, Object>(); 
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar(), map);
					}
				}
				else {
					Map<String, Object> map; 
					map = new HashMap<String, Object>();
					map.put(variavel.getNomeCampo(), Integer.parseInt(valor.getValorToken()));
					mostrador.modificarVariavel(variavel.getNomeVar (), map);
				}
				break;
			case TokenTabela.IDTKN_REAL:
				if (linha != -1) {
					if (coluna != -1) {
						Par<Integer,Integer> par; 
						Map<Par<Integer,Integer>, Object> map2;

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map2 = new HashMap<Par<Integer,Integer>, Object>(); 
						map2.put(par, Double.parseDouble(valor.getValorToken()));

						Map<String, Object> map;

						map = new HashMap<String, Object>(); 
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar(), map);
					}
					else {
						Map<Integer, Object> map2; 

						map2 = new HashMap<Integer, Object>();
						map2.put(linha-1, Double.parseDouble(valor.getValorToken()));

						Map<String, Object> map; 

						map = new HashMap<String, Object>();
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar (), map);
					}
				}
				else {
					Map<String, Object> map;
					map = new HashMap<String, Object>();
					map.put( variavel.getNomeCampo(), Double.parseDouble(valor.getValorToken()));
					mostrador.modificarVariavel(variavel.getNomeVar(), map);
				}
				break;
			case TokenTabela.IDTKN_CHAR: 
				Object val_char = new Character(valor
						.getValorToken().charAt(0));
				if (linha != -1) {
					if (coluna != -1) {
						Par<Integer,Integer> par; 
						Map<Par<Integer,Integer>, Object> map2;

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map2 = new HashMap<Par<Integer,Integer>, Object>(); 
						map2.put(par, val_char);

						Map<String, Object> map;

						map = new HashMap<String, Object>(); 
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar(), map);
					}
					else {
						Map<Integer, Object> map2; 

						map2 = new HashMap<Integer, Object>();
						map2.put(linha-1, val_char);

						Map<String, Object> map;

						map = new HashMap<String, Object>();
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar(), map);
					} 
				}
				else {
					Map<String, Object> map;
					map = new HashMap<String, Object>();
					map.put(variavel.getNomeCampo(), val_char); 
					mostrador.modificarVariavel(variavel.getNomeVar(), map);
				}
				break;
			case TokenTabela.IDTKN_STRING:
				if (linha != -1) {
					if (coluna != -1) { 
						Par<Integer,Integer> par;
						Map<Par<Integer,Integer>, Object> map2;

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map2 = new HashMap<Par<Integer,Integer>, Object>();
						map2.put(par, valor.getValorToken());

						Map<String, Object> map; 

						map = new HashMap<String, Object>();
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar (), map);
					}
					else {
						Map<Integer, Object> map2;

						map2 = new HashMap<Integer, Object>();
						map2.put (linha-1, valor.getValorToken());

						Map<String, Object> map;

						map = new HashMap<String, Object>();
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar(), map);
					}
				}
				else {
					Map<String, Object> map; 
					map = new HashMap<String, Object>();
					map.put(variavel.getNomeCampo(), valor.getValorToken());
					mostrador.modificarVariavel(variavel.getNomeVar(), map);
				}
				break;
			case     TokenTabela.IDTKN_BOOLEAN:
				boolean val = true;
				if (valor.getValorToken().equalsIgnoreCase("false")){
					val = false; 
				}
				if (linha != -1) {
					if (coluna != -1) {
						Par<Integer,Integer> par;
						Map<Par<Integer,Integer>, Object> map2; 

						par = new Par<Integer,Integer>(linha-1,coluna-1);
						map2 = new HashMap<Par<Integer,Integer>, Object>();
						map2.put(par, val);

						Map<String, Object> map;

						map = new HashMap<String, Object>();
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar(), map);

					}
					else {
						Map<Integer, Object> map2; 

						map2 = new HashMap<Integer, Object>();
						map2.put(linha-1, val);

						Map<String, Object> map;

						map = new HashMap<String, Object>();
						map.put(variavel.getNomeCampo(), map2);
						mostrador.modificarVariavel(variavel.getNomeVar(), map);
					} 
				}
				else {
					Map<String, Object> map;
					map = new HashMap<String, Object>();
					map.put(variavel.getNomeCampo(), val);
					mostrador.modificarVariavel(variavel.getNomeVar(), map);
				}
				break;
			}
		}
	}
}
